/**
 * 通用工具函数
 */
const commonFun = {
  // 格式化日期
  formatDate(date, fmt = 'yyyy-MM-dd HH:mm:ss') {
    if (!date) return '';
    if (typeof date === 'string') {
      date = new Date(date);
    }
    const o = {
      'M+': date.getMonth() + 1,
      'd+': date.getDate(),
      'H+': date.getHours(),
      'm+': date.getMinutes(),
      's+': date.getSeconds(),
      'q+': Math.floor((date.getMonth() + 3) / 3),
      'S': date.getMilliseconds()
    };
    if (/(y+)/.test(fmt)) {
      fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
    }
    for (let k in o) {
      if (new RegExp('(' + k + ')').test(fmt)) {
        fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)));
      }
    }
    return fmt;
  },

  /**
   * 下载文件
   * @param {Blob|ArrayBuffer} data 文件数据
   * @param {Object} headers 响应头对象
   * @param {string} filename 文件名（可选）
   */
  downloadFile(data, headers, filename) {
    // 从响应头获取文件名
    if (!filename && headers && headers['content-disposition']) {
      const contentDisposition = headers['content-disposition'];
      if (contentDisposition.indexOf('filename') !== -1) {
        filename = decodeURIComponent(contentDisposition.split('filename=')[1].replace(/"/g, ''));
      }
    }

    // 默认文件名
    if (!filename) {
      filename = `file_${new Date().getTime()}`;
    }

    // 创建 Blob 对象
    const blob = new Blob([data]);

    // 创建下载链接
    const url = window.URL.createObjectURL(blob);
    const link = document.createElement('a');
    link.href = url;
    link.setAttribute('download', filename);
    document.body.appendChild(link);
    link.click();
    link.parentNode.removeChild(link);

    // 释放 URL 对象
    window.URL.revokeObjectURL(url);
  },
  debounce(func, wait, immediate) {
    let time;
    const debounced = function () {
      const context = this;
      if (time) clearTimeout(time);

      if (immediate) {
        const callNow = !time;
        if (callNow) func.apply(context, arguments);
        time = setTimeout(
          () => {
            time = null;
          }, // 见注解
          wait
        );
      } else {
        time = setTimeout(() => {
          func.apply(context, arguments);
        }, wait);
      }
    };
    return debounced;
  }
};

export default commonFun;

